// 存放程序的配置信息
package config

import (
	"operator/utils/logs"
	"path"
	"runtime"

	"github.com/sirupsen/logrus"
	"github.com/spf13/viper"
	"k8s.io/client-go/kubernetes"
)

const (
	TimeFormat                    string = "2024-01-01 12:01:01"
	ClusterConfigSecretLabelKey   string = "kubeasy.com/cluster.metadata"
	ClusterConfigSecretLabelValue string = "true"
)

var (
	Port string
	// inCluster 相关配置
	MetadataNamespace string // 元数据存储的namespace
	// inCluster 客户端
	InClusterClientSet *kubernetes.Clientset
	ClusterKubeconfig  map[string]string
	InCluster          string
)

// 封装和规范数据
type ReturnData struct {
	Status  int                    `json:"status"`
	Message string                 `json:"message"`
	Data    map[string]interface{} `json:"data"`
}

// 构造函数 ，结构体本身是不能设置默认值的，构造函数是结构体的一个方法
func NewReturnData() ReturnData {
	returnData := ReturnData{}
	returnData.Status = 200
	returnData.Message = ""
	data := make(map[string]interface{})
	returnData.Data = data
	return returnData
}

func initLogConfig(logLevel string) {
	// 配置程序的日志输出级别
	if logLevel == "Info" {
		logrus.SetLevel(logrus.InfoLevel)
	} else {
		logrus.SetLevel(logrus.InfoLevel)
	}
	// 文件名和行号
	logrus.SetReportCaller(true)
	// 日志格式改成json
	logrus.SetFormatter(&logrus.JSONFormatter{
		TimestampFormat: TimeFormat,
		// runtime.Frame: 帧，可用于获取调用者返回的PC值的函数，文件或者是行信息。 （PC值-当前方法的内存地址，可以通过这个获取哪个方法、哪一行执行的）
		CallerPrettyfier: func(f *runtime.Frame) (function string, file string) {
			// 获取函数名，文件名
			fileName := path.Base(f.File)
			return f.Function, fileName
		},
	})
}

func init() {
	// logs.Info(nil, "开始加载程序配置")
	logs.Info(nil, "开始加载程序配置")

	// 环境变量加载我们程序配置，如windows环境变量，mac ~/.zshrc
	viper.SetDefault("LOG_LEVEL", "Info")
	viper.SetDefault("PORT", ":8080")

	// inCluster相关配置
	viper.SetDefault("METADATA_NAMESPACE", "default")
	// viper.SetDefault("INCLUSTER_KUBECONFIG_PATH", "。/meta.kubeconfig")
	viper.SetDefault("IN_CLUSTER", "false")

	// 自动将配置文件中的环境变量名称转换为大写形式
	viper.AutomaticEnv()
	InCluster = viper.GetString("IN_CLUSTER") // Incluster配置

	logLevel := viper.GetString("LOG_LEVEL") // 获取程序配置
	Port = viper.GetString("PORT")

	// 加载日志格式
	initLogConfig(logLevel)

}
